#include "serialportcore.h"
#include <QSerialPortInfo>

//构造函数
SerialPortCore::SerialPortCore(QObject *parent) : QObject(parent)
{
    m_serial = new QSerialPort(this);//初始化串口对象
        //连接串口接收数据信号
       connect(m_serial, &QSerialPort::readyRead, this, [this]() {
           emit dataReceived(m_serial->readAll());
       });
        //连接串口错误信号
       connect(m_serial, &QSerialPort::errorOccurred, this, [this](QSerialPort::SerialPortError error) {
           if (error != QSerialPort::NoError) {
               emit errorOccurred(m_serial->errorString());
           }
       });
}

SerialPortCore::~SerialPortCore() {
    close();
    delete m_serial;
}

//可用串口
QStringList SerialPortCore::getAvailablePorts() const {
    QStringList ports;//创建存储串口名称的列表
    for (const auto &info : QSerialPortInfo::availablePorts()) {
        //筛选有效有效的串口名称并添加到列表
        if (!info.portName().isEmpty()) {
            ports<< info.portName();
        }
    }
    return ports;
}

bool SerialPortCore::open(const QString &portName, qint32 baudRate) {
    if (m_serial->isOpen()) close();
    //串口通信的基本参数，必须与外接设备的参数一致才能正常通信。
    m_serial->setPortName(portName);//设置串口名称
    m_serial->setBaudRate(baudRate);//设置波特率
    m_serial->setDataBits(QSerialPort::Data8);//数据位：8位
    m_serial->setParity(QSerialPort::NoParity);//校验位：无校验
    m_serial->setStopBits(QSerialPort::OneStop);//停止位：1位
    m_serial->setFlowControl(QSerialPort::NoFlowControl);//流控制：无

    bool success = m_serial->open(QIODevice::ReadWrite);
    emit
stateChanged(success);
    return success;
}

void SerialPortCore::close() {
    if (m_serial->isOpen()) {
        m_serial->close();
        emit
stateChanged(false);
    }
}

qint64 SerialPortCore::sendData(const QByteArray &data) {
    if (!m_serial->isOpen()) return -1;
    return m_serial->write(data);
}

bool SerialPortCore::isOpen() const {
    return m_serial->isOpen();
}
